package com.sd365.permission.centre.service;

import com.sd365.common.core.annotation.mybatis.Pagination;
import com.sd365.common.core.annotation.stuffer.CommonFieldStuffer;
import com.sd365.common.core.annotation.stuffer.MethodTypeEnum;
import com.sd365.common.core.common.api.CommonPage;
import com.sd365.permission.centre.entity.Node;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.pojo.dto.*;
import com.sd365.permission.centre.pojo.query.RoleQuery;
import com.sd365.permission.centre.pojo.query.UserQuery;
import com.sd365.permission.centre.pojo.vo.RoleCompanyVO;
import com.sd365.permission.centre.pojo.vo.RoleVO;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @version 1.0
 * @ClassName: RoleService
 * @Description: xxx
 * @Author: Hejiale
 * @Date: 2023-06-15 14:05
 **/
@Validated
public interface RoleService {
    /**
     * 状态标记
     */
    byte INITIALIZE_STATUS_VALUE = 1;

    /**
     * 版本标记
     */
    long INITIALIZE_VERSION_VALUE = 1;

    /**
     * 通过传入一个role获取所有的角色资源进行缓存，通常role为空
     * @return
     */
    @Transactional
    Boolean loadRoleResource2Cache();

    /**
     * 给角色关联资源
     * @param roleResourceDTO
     * @return
     */
    @Transactional
    Boolean assignResource(@NotNull @Valid RoleResourceDTO roleResourceDTO);

    /**
     * 给用户关联角色
     * @param userRoleDTO
     * @return
     */
    @Transactional
    Boolean assignUser(@NotNull @Valid UserRoleDTO userRoleDTO);

    /**
     * 通过角色Id查找该角色拥有的所有资源
     * @param roleId
     * @return
     */
    List<Node> queryResourceByRoleId(@NotNull  @Valid Long roleId);

    /**
     * 查询公司
     * @return
     */
    List<Node> selectCompany();

    /**
     * 验证角色是否已经存在，主要通过角色码code进行判断
     * @param roleDTO
     * @return
     */
    Boolean haveRole(@NotNull  @Valid RoleDTO roleDTO);

    /**
     * 修改角色时验证冲突
     * @param roleDTO
     * @return
     */
    Boolean haveRole2(@NotNull @Valid RoleDTO roleDTO);
    /**
     * 增加一个角色
     * @param roleDTO
     * @return
     */
    Boolean add(@NotNull @Valid RoleDTO roleDTO);

    /**
     * 删除一个角色
     * @param id 角色id
     * @param version 版本号，用于实现乐观锁
     * @return
     */
    Boolean remove(@NotNull @Valid Long id, @NotNull  @Valid Long version);

    /**
     * 修改角色基本资料
     * @param roleDTO
     * @return
     */
    Boolean modify(@NotNull @Valid RoleDTO roleDTO);

    /**
     * 根据query内的参数字段查询角色
     * @param roleQuery
     * @return
     */
    @Pagination
    @CommonFieldStuffer(methodType = MethodTypeEnum.QUERY)
    CommonPage<RoleVO> commonQuery(@NotNull  @Valid RoleQuery roleQuery);

    /**
     * 通过角色ID查询角色
     * @param id
     * @return
     */
    RoleVO queryById(@NotNull  @Valid Long id);

    /**
     * 复制一个角色，同queryById
     * @param id
     * @return 返回通过角色ID查找到的RoleDTO
     */
    RoleVO copy(@NotNull @Valid  Long id);

    /**
     * 批量删除角色，是否可以改进为传ids
     * @param roleDeleteDTOS
     * @return
     */
    @Transactional
    Boolean batchRemove(@NotEmpty @Valid RoleDeleteDTO[] roleDeleteDTOS);

    /**
     * 绑定角色到相应的用户，此方法查找系统用户显示在对话框
     * @param userQuery 查询条件
     * @return 用户列表 重构为 CommonPage对象
     */
    @Pagination
    CommonPage<UserDTO> commonQueryUser(@NotNull  @Valid  UserQuery userQuery);

    /**
     * 通过用户ID查找用户所有的角色
     * @param id
     * @return
     */
    RoleVO queryRoleResouce(@NotNull @Valid Long id);

    /**
     * 通过角色ID查询关联的公司
     * @param id
     * @return
     */
    RoleCompanyVO queryRoleCompanyById(@NotNull @Valid Long id);

    /**
     * 修改角色关联的公司
     * @param roleCompanyDTO
     * @return
     */
    Boolean modifyRoleCompany(@NotNull @Valid RoleCompanyDTO roleCompanyDTO);

}
